home *** CD-ROM | disk | FTP | other *** search
- /*
- * FILE: dfile.c
- * AUTHOR: R. Gonzalez
- * CREATED: January 30, 1991
- *
- * Defines simple database file access methods.
- */
-
- # include "dfile.h"
- # include <stdlib.h>
- # include <string.h>
- # include <stdio.h>
- # include "morestr.h"
-
- # define MAX_LENGTH 80
-
- /************************************************************************
- * initialize
- ************************************************************************/
- boolean Dfile::init(void)
- {
- filename = NULL;
- num_data = 0;
-
- return TRUE;
- }
-
- /************************************************************************
- * open existing file
- ************************************************************************/
- boolean Dfile::open_existing(char *filename_val)
- {
- boolean success;
- int temp_int,
- i;
- char temp_char[MAX_LENGTH],
- junk;
- FILE *file;
-
- if ((file = fopen(filename_val,"r")) == NULL)
- success = FALSE;
- else
- {
- success = TRUE;
- destroy();
- init();
- /* is it right that Turbo C++ requires me to cast malloc's
- return value here and later in this file? */
- filename = (char*) malloc(sizeof(char) * (strlen(filename_val)+1));
- strcpy(filename,filename_val);
- fscanf(file,"%d",&temp_int);
- junk = fgetc(file);
- num_data = temp_int; /* "shadowing" for Think C */
- for (i=0 ; i<num_data ; i++)
- {
- get_line(file,temp_char,MAX_LENGTH);
- name[i] = (char*) malloc(sizeof(char) * (strlen(temp_char)+1));
- strcpy(name[i],temp_char);
- get_line(file,temp_char,MAX_LENGTH);
- age[i] = (char*) malloc(sizeof(char) * (strlen(temp_char)+1));
- strcpy(age[i],temp_char);
- }
- fclose(file);
- }
-
- return success;
- }
-
- /************************************************************************
- * write to a valid file
- ************************************************************************/
- boolean Dfile::write_valid(char *filename_val)
- {
- int i;
- FILE *file;
- boolean success;
-
- if (strcmp(filename_val,"") != 0)
- {
- file = fopen(filename_val,"w");
- if (filename != NULL)
- free(filename);
- filename = (char*) malloc(sizeof(char) * (strlen(filename_val)+1));
- strcpy(filename,filename_val);
- }
- else
- {
- if (filename != NULL)
- file = fopen(filename,"w");
- else
- file = NULL;
- }
-
- if (file == NULL)
- success = FALSE;
- else
- {
- success = TRUE;
- fprintf(file,"%d\n",num_data);
- for (i=0 ; i<num_data ; i++)
- {
- fprintf(file,"%s\n",name[i]);
- fprintf(file,"%s\n",age[i]);
- }
-
- fclose(file);
- }
-
- return success;
- }
-
- /************************************************************************
- * add a record
- ************************************************************************/
- boolean Dfile::add_record(char *name_val,char *age_val)
- {
- boolean success;
-
- if (num_data+1 < MAX_DATA)
- {
- success = TRUE;
- name[num_data] = (char*) malloc(sizeof(char) * (strlen(name_val)+1));
- strcpy(name[num_data],name_val);
- age[num_data] = (char*) malloc(sizeof(char) * (strlen(age_val)+1));
- strcpy(age[num_data],age_val);
- num_data++;
- }
- else
- success = FALSE;
-
- return success;
- }
-
- /************************************************************************
- * get a record
- ************************************************************************/
- boolean Dfile::get_record(int record_no,char *record)
- {
- boolean success;
-
- if (record_no >= num_data)
- success = FALSE;
- else
- {
- success = TRUE;
- strcpy(record,name[record_no]);
- strcat(record,", ");
- strcat(record,age[record_no]);
- }
-
- return success;
- }
-
- /************************************************************************
- * sort database by name
- ************************************************************************/
- boolean Dfile::sort_by_name(void)
- {
- int i,
- j;
- char temp[MAX_LENGTH];
-
- for (i=0 ; i<num_data ; i++)
- for (j=i ; j<num_data ; j++)
- {
- if (strcmp(name[i],name[j]) > 0)
- {
- strcpy(temp,name[i]);
- free(name[i]);
- name[i] = (char*) malloc(sizeof(char) * (strlen(name[j])+1));
- strcpy(name[i],name[j]);
- free(name[j]);
- name[j] = (char*) malloc(sizeof(char) * (strlen(temp)+1));
- strcpy(name[j],temp);
- strcpy(temp,age[i]);
- free(age[i]);
- age[i] = (char*) malloc(sizeof(char) * (strlen(age[j])+1));
- strcpy(age[i],age[j]);
- free(age[j]);
- age[j] = (char*) malloc(sizeof(char) * (strlen(temp)+1));
- strcpy(age[j],temp);
- }
- }
-
- return TRUE;
- }
-
- /************************************************************************
- * sort database by age
- ************************************************************************/
- boolean Dfile::sort_by_age(void)
- {
- int i,
- j;
- char temp[MAX_LENGTH];
-
- for (i=0 ; i<num_data ; i++)
- for (j=i ; j<num_data ; j++)
- {
- if (strtoint(age[i]) > strtoint(age[j]))
- {
- strcpy(temp,name[i]);
- free(name[i]);
- name[i] = (char*) malloc(sizeof(char) * (strlen(name[j])+1));
- strcpy(name[i],name[j]);
- free(name[j]);
- name[j] = (char*) malloc(sizeof(char) * (strlen(temp)+1));
- strcpy(name[j],temp);
- strcpy(temp,age[i]);
- free(age[i]);
- age[i] = (char*) malloc(sizeof(char) * (strlen(age[j])+1));
- strcpy(age[i],age[j]);
- free(age[j]);
- age[j] = (char*) malloc(sizeof(char) * (strlen(temp)+1));
- strcpy(age[j],temp);
- }
- }
-
- return TRUE;
- }
-
- /************************************************************************
- * show name - we need the app_ptr in order to use query() or respond()!
- ************************************************************************/
- void Dfile::show_name(Test_App *app_ptr)
- {
- if (filename == NULL)
- app_ptr->respond("No name.");
- else
- app_ptr->respond(filename);
- }
-
- /************************************************************************
- * destroy
- ************************************************************************/
- boolean Dfile::destroy(void)
- {
- int i;
-
- for (i=0 ; i<num_data ; i++)
- {
- free(name[i]);
- free(age[i]);
- }
-
- if (filename != NULL)
- free(filename);
-
- return TRUE;
- }
-
-